def clouser1 = { println 'hello groovy' }

//闭包调用
clouser1.call()
clouser1()

//只有一个参数可以省略，使用时可以是it
def clouser2 = { String name, int age -> println "hello $name age is $age" }
def return2 = clouser2('groovy', 18)
println return2 //没有返回值就是null

//闭包的返回值
def clouser3 = {
    println 'hello groovy'
    return 666
}

def return3 = clouser3()

println return3


///////闭包求阶乘
int x = fab1(5)
println x

int y= cal(101)
println y

//int fab(int number) {
//
//    int result = 1
//    1.upto(number) {
//        num -> result *= num
//    }
//    return result
//}


int fab1(int number){
    int result = 1
    number.downto(1){
        num -> result*=num
    }
    //return 可以省略
    result
}

int cal(int number){
    int result = 0
    //循环
    number.times {
        num->result+=num
    }
    result
}

//////字符串闭包

String str1='hello groovy'
String str2='688688'

//遍历每一个字符
println str1.each {
    str->print str.multiply(2)
}

//找到符合条件的第一个字符
println str1.find{
    s->s.equals('o')
}

//找到所有符合条件的字符
println str1.findAll {
    s->s.equals('o')
}.toListString()

//是否存在符合条件的一个字符
println str1.any {
    s->s.equals('a')
}

//是否存在每一个字符符合条件
println str2.every {
    s->s.number
}

println str1.collect {
    s->s.toUpperCase()
}.toListString()

/**
 * 闭包的三个重要变量：this,owner,delegate
 *
 */
//简单的闭包或者类这三个变量都是同一个
def scriptClouser = {
    println 'this:'+this //代表闭包定义处的类
    println 'owner:'+owner//代表闭包定义处的类或者对象
    println 'delegate:'+delegate //代表任意对象
}
scriptClouser()

class A{}

A a = new A()

//嵌套的闭包
def nestClouser = {

    def innerClouser = {
        println 'innerClouser-this:'+this //代表闭包定义处的类，指的是外层的嵌套闭包类，不可更改
        println 'innerClouser-owner:'+owner//代表闭包定义处的类或者对象,指的是最近的内部闭包类，不可更改
        println 'innerClouser-delegate:'+delegate //代表任意对象，指的是最近的内部闭包类，可更改
    }
    innerClouser.delegate = a
    innerClouser()
}

nestClouser()


/**
 * 闭包的委托策略
 */
class Student{
    String name

    def pretty = {"My name is $name"}

    @Override
     String toString() {
       pretty()
    }
}

class Teacher{
    String name
}

def stu = new Student(name: 'Cherry')
def tea  = new Teacher(name: 'Json')

stu.pretty.delegate = tea
//有四种策略
stu.pretty.resolveStrategy = Closure.DELEGATE_FIRST
println stu.toString()































